package com.simplehire.service;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
import org.springframework.web.reactive.function.client.WebClientResponseException;

import java.time.Duration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class DeepSeekService {

    @Value("${deepseek.api.url}")
    private String apiUrl;

    @Value("${deepseek.api.key}")
    private String apiKey;

    @Value("${deepseek.api.model}")
    private String model;

    @Value("${deepseek.api.max-tokens}")
    private int maxTokens;

    @Value("${deepseek.api.temperature}")
    private double temperature;

    private final WebClient webClient;
    private final ObjectMapper objectMapper;

    public DeepSeekService() {
        this.webClient = WebClient.builder()
                .codecs(configurer -> configurer.defaultCodecs().maxInMemorySize(10 * 1024 * 1024)) // 10MB
                .build();
        this.objectMapper = new ObjectMapper();
    }

    /**
     * 生成面试问题
     */
    public String generateInterviewQuestions(String resumeText) {
        String prompt = String.format("""
            假设你是一位高级 Java 面试官，请根据以下简历内容生成 3 个相关的面试问题。
            请确保问题具有针对性，能够考察候选人的技术能力和项目经验。
            
            简历内容：
            %s
            
            请按以下格式返回：
            问题1：[具体问题]
            问题2：[具体问题]
            问题3：[具体问题]
            """, resumeText);

        return sendPrompt(prompt);
    }

    /**
     * 评估面试回答
     */
    public String evaluateInterviewAnswers(String resumeText, String questions, String answers) {
        String prompt = String.format("""
            假设你是一位高级 Java 面试官，请根据候选人的简历、面试问题和回答进行综合评估。
            
            简历内容：
            %s
            
            面试问题：
            %s
            
            候选人回答：
            %s
            
            请按以下格式进行评估：
            
            【综合评分】：X分（满分100分）
            
            【技术能力评估】：
            - [具体评价]
            
            【项目经验评估】：
            - [具体评价]
            
            【沟通表达评估】：
            - [具体评价]
            
            【改进建议】：
            1. [具体建议]
            2. [具体建议]
            3. [具体建议]
            
            【总结】：
            [整体评价和建议]
            """, resumeText, questions, answers);

        return sendPrompt(prompt);
    }

    /**
     * 分析简历内容
     */
    public String analyzeResume(String resumeText) {
        String prompt = String.format("""
            请分析以下简历内容，提取关键信息并给出专业建议：
            
            简历内容：
            %s
            
            请按以下格式分析：
            
            【基本信息】：
            - 姓名：[提取的姓名]
            - 联系方式：[提取的联系方式]
            - 教育背景：[提取的教育信息]
            
            【技能总结】：
            - 编程语言：[列出技能]
            - 框架技术：[列出技能]
            - 数据库：[列出技能]
            - 其他技能：[列出技能]
            
            【工作经历】：
            - [总结工作经历]
            
            【项目经验】：
            - [总结项目经验]
            
            【简历评估】：
            - 优势：[列出优势]
            - 不足：[列出不足]
            - 改进建议：[具体建议]
            """, resumeText);

        return sendPrompt(prompt);
    }

    /**
     * MVP V1: 结构化简历信息提取
     */
    public String extractResumeStructuredInfo(String resumeText) {
        String prompt = String.format("""
            请作为一位资深HR专家，对以下简历进行全面深度分析。请严格按照JSON格式返回详细的分析结果，不要添加任何其他文字：
            
            简历内容：
            %s
            
            请返回以下JSON格式的详细分析数据：
            {
              "basicInfo": {
                "name": "提取的姓名",
                "phone": "提取的电话号码",
                "email": "提取的邮箱地址",
                "location": "提取的地址信息",
                "age": "推测年龄或工作年限",
                "currentPosition": "当前职位"
              },
              "education": [
                {
                  "school": "学校名称",
                  "degree": "学位",
                  "major": "专业",
                  "graduationYear": "毕业年份",
                  "gpa": "成绩（如有）",
                  "honors": "荣誉或奖项（如有）"
                }
              ],
              "workExperience": [
                {
                  "company": "公司名称",
                  "position": "职位",
                  "duration": "工作时间",
                  "description": "工作描述",
                  "achievements": "主要成就",
                  "technologies": "使用的技术栈"
                }
              ],
              "skills": {
                "programmingLanguages": ["技能1", "技能2"],
                "frameworks": ["框架1", "框架2"],
                "databases": ["数据库1", "数据库2"],
                "tools": ["工具1", "工具2"],
                "softSkills": ["软技能1", "软技能2"]
              },
              "projects": [
                {
                  "name": "项目名称",
                  "description": "项目描述",
                  "technologies": ["技术1", "技术2"],
                  "role": "担任角色",
                  "achievements": "项目成果"
                }
              ],
              "scoring": {
                "overallScore": 85,
                "technicalSkills": 80,
                "experience": 75,
                "education": 90,
                "projectComplexity": 70,
                "communicationSkills": 85
              },
              "analysis": {
                "strengths": [
                  "具体优势1",
                  "具体优势2",
                  "具体优势3"
                ],
                "weaknesses": [
                  "需要改进的地方1",
                  "需要改进的地方2"
                ],
                "recommendations": [
                  "具体改进建议1",
                  "具体改进建议2",
                  "具体改进建议3"
                ],
                "careerAdvice": "职业发展建议",
                "marketValue": "市场价值评估",
                "interviewFocus": ["面试重点关注领域1", "面试重点关注领域2"]
              },
              "riskAssessment": {
                "jobStability": "工作稳定性评估",
                "careerProgression": "职业发展轨迹评估",
                "skillRelevance": "技能相关性评估"
              }
            }
            
            请确保分析内容详细具体，评分客观准确，建议实用可行。对于技术岗位，重点关注技术深度、项目复杂度和解决问题的能力。
            """, resumeText);

        return sendPrompt(prompt);
    }

    /**
     * 发送提示词到DeepSeek API
     */
    public String sendPrompt(String prompt) {
        try {
            // 构建请求体
            Map<String, Object> requestBody = new HashMap<>();
            requestBody.put("model", model);
            requestBody.put("max_tokens", maxTokens);
            requestBody.put("temperature", temperature);
            requestBody.put("stream", false);
            
            // 构建消息
            Map<String, String> message = new HashMap<>();
            message.put("role", "user");
            message.put("content", prompt);
            requestBody.put("messages", List.of(message));

            // 发送请求
            String response = webClient.post()
                    .uri(apiUrl)
                    .header(HttpHeaders.AUTHORIZATION, "Bearer " + apiKey)
                    .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
                    .bodyValue(requestBody)
                    .retrieve()
                    .bodyToMono(String.class)
                    .timeout(Duration.ofSeconds(60))
                    .block();

            // 解析响应
            return parseResponse(response);

        } catch (WebClientResponseException e) {
            String errorMsg = String.format("DeepSeek API调用失败: %s - %s", 
                    e.getStatusCode(), e.getResponseBodyAsString());
            throw new RuntimeException(errorMsg, e);
        } catch (Exception e) {
            String errorMsg = "DeepSeek API调用异常: " + e.getMessage();
            throw new RuntimeException(errorMsg, e);
        }
    }

    /**
     * 解析API响应
     */
    private String parseResponse(String response) {
        try {
            JsonNode jsonNode = objectMapper.readTree(response);
            
            // 检查是否有错误
            if (jsonNode.has("error")) {
                String errorMsg = jsonNode.get("error").get("message").asText();
                throw new RuntimeException("DeepSeek API返回错误: " + errorMsg);
            }
            
            // 提取回复内容
            JsonNode choices = jsonNode.get("choices");
            if (choices != null && choices.isArray() && choices.size() > 0) {
                JsonNode firstChoice = choices.get(0);
                JsonNode message = firstChoice.get("message");
                if (message != null) {
                    return message.get("content").asText();
                }
            }
            
            throw new RuntimeException("无法解析DeepSeek API响应");
            
        } catch (Exception e) {
            throw new RuntimeException("解析DeepSeek API响应失败: " + e.getMessage(), e);
        }
    }

    /**
     * 分析简历结构化信息
     */
    public String analyzeResumeStructured(String resumeText) {
        String prompt = "请分析以下简历内容，并以JSON格式返回结构化信息。要求包含以下字段：\n" +
                "- personalInfo: 个人信息（姓名、联系方式等）\n" +
                "- education: 教育背景\n" +
                "- workExperience: 工作经历\n" +
                "- skills: 技能清单\n" +
                "- projects: 项目经验\n" +
                "- summary: 简历总结\n\n" +
                "简历内容：\n" + resumeText;
        
        return sendPrompt(prompt);
    }
    
    /**
     * 分析岗位匹配度
     */
    public String analyzeJobMatching(String resumeText, String jobDescription) {
        String prompt = "请分析简历与岗位JD的匹配度，并以JSON格式返回详细分析结果。要求包含以下字段：\n" +
                "- overallScore: 总体匹配分数（0-100）\n" +
                "- matchLevel: 匹配等级（EXCELLENT/GOOD/FAIR/POOR）\n" +
                "- skillsMatch: 技能匹配分析\n" +
                "  - matchedSkills: 匹配的技能列表\n" +
                "  - missingSkills: 缺失的技能列表\n" +
                "  - skillScore: 技能匹配分数（0-100）\n" +
                "- experienceMatch: 经验匹配分析\n" +
                "  - experienceScore: 经验匹配分数（0-100）\n" +
                "  - experienceGap: 经验差距描述\n" +
                "- educationMatch: 教育背景匹配分析\n" +
                "  - educationScore: 教育匹配分数（0-100）\n" +
                "  - educationFit: 教育背景适配性\n" +
                "- strengths: 候选人优势（数组）\n" +
                "- weaknesses: 候选人劣势（数组）\n" +
                "- recommendations: 改进建议（数组）\n" +
                "- detailedAnalysis: 详细分析报告\n\n" +
                "岗位JD：\n" + jobDescription + "\n\n" +
                "简历内容：\n" + resumeText;
        
        return sendPrompt(prompt);
    }

    /**
     * 测试API连接
     */
    public boolean testConnection() {
        try {
            String testPrompt = "请回复'连接成功'";
            String response = sendPrompt(testPrompt);
            return response != null && !response.trim().isEmpty();
        } catch (Exception e) {
            return false;
        }
    }
}